package ar.edu.utn.frsf.tpae.a2012.g05.controller;

import java.io.IOException;
import java.io.OutputStream;
import java.io.Serializable;
import java.util.ArrayList;
import java.util.List;

import javax.annotation.PostConstruct;
import javax.faces.context.FacesContext;
import javax.servlet.http.HttpServletResponse;

import ar.edu.utn.frsf.tpae.a2012.g05.entity.Cuenta;
import ar.edu.utn.frsf.tpae.a2012.g05.entity.Movimiento;
import ar.edu.utn.frsf.tpae.a2012.g05.entity.Pago;
import ar.edu.utn.frsf.tpae.a2012.g05.exception.NegocioException;
import ar.edu.utn.frsf.tpae.a2012.g05.facade.HomeBankingFacade;
import ar.edu.utn.frsf.tpae.a2012.g05.util.ServiceLocator;

public class MovimientoBean implements Serializable {

	private static final long serialVersionUID = -2979756947473150568L;

	private Cuenta cuenta;
	private Movimiento movimiento;
	private List<Movimiento> listaMovimientos;
	
	private String mensaje;
	
	@PostConstruct
	public void init() {
		cuenta = (Cuenta) FacesContext.getCurrentInstance()
				.getExternalContext().getSessionMap().get("cuenta");
		listaMovimientos = new ArrayList<Movimiento>();
		listar();
	}
	
	public String listar() {
		HomeBankingFacade service = ServiceLocator.getHomeBankingFacade();
		try {
			this.listaMovimientos = service.findMovimientosCuenta(cuenta);
		} catch (NegocioException e) {
			this.mensaje = "Hubo un problema para cargar los datos de la cuenta: " +
					e.getMessage();
		}

		return null;
	}
	
    public String exportar() {
        String fileName = "Movimientos_Cuenta_" + cuenta.getNumero() + ".csv";
		FacesContext context = FacesContext.getCurrentInstance();
		HttpServletResponse response = (HttpServletResponse) context.getExternalContext().getResponse();
		try {
		        response.reset();
		        response.setContentType("text/comma-separated-values");
		        response.setHeader("Content-Disposition", "attachment; filename=\"" + fileName + "\"");
		        OutputStream output = response.getOutputStream();
		        
		        for (Movimiento m : listaMovimientos) {
		        	String linea = m.getFecha().toString() + ";" + m.getMonto().toString();
		        	if (m.isPago()) {
		        		linea += ";" + ((Pago) m).getCodigo();
		        		linea += ";" + ((Pago) m).getComentario();
		        	}
		        	linea += "\n";
		        	output.write(linea.getBytes());
		        }
		        output.flush();
		        output.close();
		} catch (IOException e) {
			mensaje = e.getMessage();//"Ocurrio un error al intentar exportar los movimientos";
		}
		catch (Exception e) {
			mensaje = e.getMessage();//"Ocurrio un error al intentar exportar los movimientos";
		}
		context.responseComplete();
		return null;
    }
    
	// Getters y setters, utilizados por las JSP.	

	
	public Movimiento getMovimiento() {
		return movimiento;
	}

	public void setMovimiento(Movimiento movimiento) {
		this.movimiento = movimiento;
	}
	
	public List<Movimiento> getListaMovimientos() {
		return listaMovimientos;
	}

	public void setListaMovimientos(List<Movimiento> listaMovimientos) {
		this.listaMovimientos = listaMovimientos;
	}

	public Cuenta getCuenta() {
		return cuenta;
	}

	public void setCuenta(Cuenta cuenta) {
		this.cuenta = cuenta;
	}

	public String getMensaje() {
		return mensaje;
	}

	public void setMensaje(String mensaje) {
		this.mensaje = mensaje;
	}
	
}
